In this financial analysis, we evaluate the financial performance and position of Grab Holdings. The objectives of our financial analysis are to understand the financial health of Grab Holdings, identify potential issues or opportunities, and facilitate the decision-making process. We assess the financial position, profitability, efficiency, liquidity and solvency. We compare Grab Holdings to industry peers or to the overall market. Due to that data as of December 2022 is not yet available, our analysis is limited to the years 2019-2021.
Part 1. How strong is the financial position? (balance sheet analysis)
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data={'Year':[2019,2020,2021],'Grab Holdings':[0.451,0.375,0.254],
'Gojek':[0.655,0.447,0.826]}
# Create the dataframe
df = pd.DataFrame(data)
# Create the figure
fig=go.Figure()
# Add traces
fig.add_trace(go.Bar(x=df['Year'], y=df['Grab Holdings'], name='Grab Holdings',
marker_color="darkGreen"))
fig.add_trace(go.Bar(x=df['Year'], y=df['Gojek'], name='Gojek', marker_color="deepPink"))
# Customize the appearance of the chart
fig.update_layout(title='Comparison of Long-term Assets to Long-term Liabilities and Equity<br>between Grab Holdings and Gojek<b>',
xaxis_title='Year',yaxis_title='Ratio',
barmode='group', bargap=0.50,bargroupgap=0.0)
fig.update_traces(width=0.2)
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
fig.update_xaxes(showline=True, linewidth=2, linecolor='black')
fig.update_yaxes(showline=True, linewidth=2, linecolor='black')
# For a white background
fig.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data={'Year':[2020,2021],'Grab Holdings':[0.0353,0.2171],'Gojek':[0.4558,1.893]}
# Create the dataframe
df = pd.DataFrame(data)
# Create the figure
fig=go.Figure()
# Add traces
fig.add_trace(go.Bar(x=df['Year'], y=df['Grab Holdings'], name='Grab Holdings',
marker_color="darkGreen"))
fig.add_trace(go.Bar(x=df['Year'], y=df['Gojek'], name='Gojek', marker_color="deepPink"))
# Customize the appearance of the chart
fig.update_layout(title='Comparison of PP&E/LTD between Grab Holdings and Gojek',
xaxis_title='Year',yaxis_title='Ratio',
barmode='group', bargap=0.50,bargroupgap=0.0)
fig.update_traces(width=0.2)
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Create a dictionary with the data
data = {'Grab Holdings 1': ['Interest', 'SG&A', 'COGS'],
'Grab Holdings 2': [252.00,116.44,107.41], 'Gojek 1': ['SG&A', 'COGS', 'R&D'],
'Gojek 2':[402.08,83.24,54.90]}
# Create the dataframe
df=pd.DataFrame(data)
# Create the figure
fig = make_subplots(rows=1, cols=2,subplot_titles=['Grab Holdings','Gojek'],
shared_yaxes=True)
# Add traces
fig.add_trace(go.Bar(x=df['Grab Holdings 1'],y=df['Grab Holdings 2'],name='Grab Holdings',
marker_color=['darkGreen','seaGreen','lightGreen']),row=1, col=1)
fig.add_trace(go.Bar(x=df['Gojek 1'],y=df['Gojek 2'],name='Gojek',
marker_color=['deepPink','hotPink','lightPink']),row=1, col=2)
# Customize the appearance of the chart
fig.update_layout(title='Top Three Expenses in 2021 (% of total sales)')
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14))
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data={'Year':[2020,2021],'Grab Holdings':[-556.08,-510.96],'Gojek':[-426.96,-471.61]}
# Create the dataframe
df = pd.DataFrame(data)
# Create the figure
fig=go.Figure()
# Add traces
fig.add_trace(go.Bar(x=df['Year'], y=df['Grab Holdings'], name='Grab Holdings',
marker_color="darkGreen"))
fig.add_trace(go.Bar(x=df['Year'], y=df['Gojek'], name='Gojek', marker_color="deepPink"))
# Customize the appearance of the chart
fig.update_layout(title='Comparison of Profitability between Grab Holdings and Gojek',
xaxis_title='Year',yaxis_title='Profit margin (%)',
barmode='group', bargap=0.50,bargroupgap=0.0)
fig.update_traces(width=0.2)
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data={'Year':[2019,2020,2021],'COGS':[673,576,725],
'Depreciation & Amortization':[647,387,345],'R&D':[231,257,356],'SG&A':[583,477,786],
'Interest':[1056,1490,1701]}
# Create the dataframe
df = pd.DataFrame(data)
# Create the figure
fig = go.Figure()
# Create a dictionary for line color
color={'COGS':'saddlebrown','Depreciation & Amortization':'orange','R&D':'Green',
'SG&A':'royalblue','Interest':'red'}
# Add traces
for i in data:
if i!='Year':
fig.add_trace(go.Scatter(x=df['Year'],y=df[i],mode='lines+markers',
name=i,marker_color=color[i]))
# Customize the appearance of the chart
fig.update_traces(line_width=4,marker_size=10)
fig.update_xaxes(showline=True, linewidth=2, linecolor='black',tickvals=[2019,2020,2021])
fig.update_yaxes(showline=True, linewidth=2, linecolor='black',gridcolor='black')
fig.update_layout(title='Trends of Major Expenses of Grab Holdings', xaxis_title='Year',
yaxis_title='In million US dollars')
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# For a white background
fig.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
CF = {'Year': ['2021', '2020', '2019'],
'Net Operating Cash Flow': [-1018, -609, -2053],
'Net Investing Cash Flow': [-2802, -40, 537],
'Net Financing Cash Flow': [6691, 1266, 1847]}
# Create the dataframe
grab = pd.DataFrame(CF)
# Create the figure
fig_CF = go.Figure()
# Remove the scrolling bar
fig_CF.update_layout(updatemenus=[])
# Add traces
fig_CF.add_trace(go.Bar(x=grab['Year'], y=grab['Net Operating Cash Flow'],
name='Net Operating Cash Flow',
marker=dict(color=['dimgrey', 'dimgrey', 'dimgrey'])))
fig_CF.add_trace(go.Bar(x=grab['Year'], y=grab['Net Investing Cash Flow'],
name='Net Investing Cash Flow',
marker=dict(color=['deepskyblue', 'deepskyblue', 'deepskyblue'])))
fig_CF.add_trace(go.Bar(x=grab['Year'], y=grab['Net Financing Cash Flow'],
name='Net Financing Cash Flow',
marker=dict(color=['darkgreen', 'darkgreen', 'darkgreen'])))
# Customize the appearance of the chart
fig_CF.update_layout(title='Cash flow statement: Trends over time (In million US dollars)',
xaxis_title='Year',
yaxis_title='Cash flow components')
fig_CF.update_layout(title_font=dict(size=20),legend_font=dict(size=12),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# For a white background
fig_CF.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig_CF.show()
# Setup
import pandas as pd
# Create a dictionary with the data
data = {'Year': [2021, 2020, 2019],
'Change in Capital Stock': [4471, 5, 6],
'Net Issuance/Reduction of Debt': [1804, -98, -1841],
'Repayments of Operating Leases Liabilities': [-24, -30, 0],
'Other Funds': [440, 1389, 0],
'Net Financing Cash Flow': [6691, 1266, 1847]
}
# Create the dataframe
CFF = pd.DataFrame(data)
CFF_2021=CFF[CFF['Year'] == 2021]
# Create the figure
fig_CFF= go.Figure()
# Add the first trace with a name
fig_CFF.add_trace(go.Bar(x=CFF_2021['Year'], y=CFF_2021['Change in Capital Stock'],
name='Change in Capital Stock', marker=dict(color=['darkgreen']),
text=['4471'], textposition='auto'))
# Add other traces with a name
fig_CFF.add_trace(go.Bar(x=CFF_2021['Year'], y=CFF_2021['Net Issuance/Reduction of Debt'],
name='Net Issuance/Reduction of Debt',
marker=dict(color=['seagreen']), text=['1804'],
textposition='auto'))
fig_CFF.add_trace(go.Bar(x=CFF_2021['Year'], y=CFF_2021['Repayments of Operating Leases Liabilities'],
name='Repayments of Operating Leases Liabilities',
marker=dict(color=['lightgrey'])))
fig_CFF.add_trace(go.Bar(x=CFF_2021['Year'], y=CFF_2021['Other Funds'],
name='Other Funds', marker=dict(color=['darkgrey'])))
fig_CFF.add_trace(go.Bar(x=CFF_2021['Year'], y=CFF_2021['Net Financing Cash Flow'],
name='Net Financing Cash Flow', marker=dict(color=['dimgrey']),
text=['6691'], textposition='auto'))
# Customize the appearance of the chart
fig_CFF.update_layout(title='Sale of Stock and Issuance of Debt largely explain the positive FCF in 2021',
xaxis_title='Year',
yaxis_title='In million US dollars')
fig_CFF.update_layout(title_font=dict(size=20),legend_font=dict(size=11),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# For a white background
fig_CFF.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig_CFF.show()
# Setup
import pandas as pd
# Create a dictionary with the data
data = {'Year': [2021, 2020, 2019],
'Capital Expenditures': [-85, -40, -140],
'Net Assets from Acquisitions': [-460, -3, -225],
'Sale of Fixed Assets & Businesses': [468, 392, 333],
'Purchase/Sale of Investments': [-2725, -359, 569],
'Net Investing Cash Flow': [-2802, -40, 537]
}
# Create the dataframe
CFI = pd.DataFrame(data)
CFI_2021=CFI[CFI['Year'] == 2021]
# Create the figure
fig_CFI= go.Figure()
# Add the first trace with a name
fig_CFI.add_trace(go.Bar(x=CFI_2021['Year'], y=CFI_2021['Capital Expenditures'],
name='Capital Expenditures', marker=dict(color=['#e5f0e3'])))
# Add other traces with a name
fig_CFI.add_trace(go.Bar(x=CFI_2021['Year'], y=CFI_2021['Net Assets from Acquisitions'],
name='Net Assets from Acquisitions', marker=dict(color=['#e5f0e3'])))
fig_CFI.add_trace(go.Bar(x=CFI_2021['Year'], y=CFI_2021['Sale of Fixed Assets & Businesses'],
name='Sale of Assets', marker=dict(color=['#e5f0e3'])))
fig_CFI.add_trace(go.Bar(x=CFI_2021['Year'], y=CFI_2021['Purchase/Sale of Investments'],
name='Purchases/Sale of Investments', marker=dict(color=['darkgreen']),
text=['-2725'], textposition='auto'))
fig_CFI.add_trace(go.Bar(x=CFI_2021['Year'], y=CFI_2021['Net Investing Cash Flow'],
name='Net Investing Cash Flow', marker=dict(color=['dimgrey']),
text=['-2802'], textposition='auto'))
# Customize the appearance of the chart
fig_CFI.update_layout(title='Purchases of Investments predominantly explains the negative CFI in 2021',
xaxis_title='Year',
yaxis_title='In million US dollars')
fig_CFI.update_layout(title_font=dict(size=20),legend_font=dict(size=11),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# For a white background
fig_CFI.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig_CFI.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data = {'Year': ['2019', '2020', '2021'],
'Total Current Assets GRAB': [3140, 3755, 8675], 'Total Current Assets GOJEK': [469, 2654, 1146],
'Total Current Liabilities GRAB': [783, 836, 1026], 'Total Current Liabilities GOJEK': [5100, 5764, 12294],
'Current Ratio GRAB': [3140/783,3755/836,8675/1026],
'Current Ratio GOJEK': [469/5100,2654/5764,1146/12294]}
# Create the dataframe
df1 = round(pd.DataFrame(data),2)
# Create the figure
fig = go.Figure()
# Add traces
fig.add_trace(go.Scatter(
x=data['Year'],
y=data['Current Ratio GRAB'],
mode='lines+markers', name = 'Grab Holdings', line_color='darkgreen'
))
fig.add_trace(go.Scatter(
x=data['Year'],
y=data['Current Ratio GOJEK'],
mode='lines+markers', name = 'Gojek', line_color='deeppink'
))
# Customize the appearance of the chart
fig.update_layout(title='Current Ratio: Grab Holdings vs. Gojek',
xaxis_title='Year',
yaxis_title='Current Ratio')
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
# Create a dictionary with the data
data = {'Year': ['2019', '2020', '2021'],"Grab Holdings" : [1.712, 2.025, 0.195],
'Gojek' : [0.049, 0.089, 0.015]}
# Create the dataframe
df = pd.DataFrame(data)
# Create the figure
fig = go.Figure()
# Add traces
fig.add_trace(go.Bar(x=df['Year'], y=df['Grab Holdings'], name='Grab Holdings',
marker_color="darkGreen"))
fig.add_trace(go.Bar(x=df['Year'], y=df['Gojek'], name='Gojek', marker_color="deepPink"))
# Customize the appearance of the chart
fig.update_xaxes(showline=True, linewidth=2, linecolor='black')
fig.update_yaxes(showline=True, linewidth=2, linecolor='black',gridcolor='black')
fig.update_layout(title='Comparison of Debt to Asset Solvency Ratios of Two Companies<br>Over Three Years',
xaxis_title='Year',
yaxis_title='Debt to Asset Solvency Ratio')
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=14),
yaxis_title_font=dict(size=16),xaxis_title_font=dict(size=16))
# For a white background
fig.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig.show()
# Setup
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Create a dictionary with the data
data = {
'Category': ['Return on Equity', 'Return on Assets', 'Equity Multiplier', 'Profit Margin', 'Asset Turnover'],
'Grab 2021': [-0.5171, -0.415, 12.46, -5.1096, 0.08],
'Gojek 2021': [-0.2667, -0.2309, 1.15, -4.7161, 0.05]
}
# Create the dataframe
df = pd.DataFrame(data)
ROE = df[df['Category'] == 'Return on Equity']
ROA = df[df['Category'] == 'Return on Assets']
EquityM = df[df['Category'] == 'Equity Multiplier']
ProfitM = df[df['Category'] == 'Profit Margin']
AssetTurn = df[df['Category'] == 'Asset Turnover']
# Create the figure
fig = make_subplots(rows=1, cols=5, start_cell="top-left")
# Add traces
fig.add_trace(go.Bar(x=['Grab<br>Holdings', 'Gojek'], y=[ROE['Grab 2021'].values[0],
ROE['Gojek 2021'].values[0]],
name='ROE'), row=1, col=1)
fig.add_trace(go.Bar(x=['Grab<br>Holdings', 'Gojek'], y=[ROA['Grab 2021'].values[0],
ROA['Gojek 2021'].values[0]],
name='ROA'), row=1, col=2)
fig.add_trace(go.Bar(x=['Grab<br>Holdings', 'Gojek'], y=[EquityM['Grab 2021'].values[0],
EquityM['Gojek 2021'].values[0]],
name='Equity Multiplier'), row=1, col=3)
fig.add_trace(go.Bar(x=['Grab<br>Holdings', 'Gojek'], y=[ProfitM['Grab 2021'].values[0],
ProfitM['Gojek 2021'].values[0]],
name='Profit Margin'), row=1, col=4)
fig.add_trace(go.Bar(x=['Grab<br>Holdings', 'Gojek'], y=[AssetTurn['Grab 2021'].values[0],
AssetTurn['Gojek 2021'].values[0]],
name='Asset Turnover'), row=1, col=5)
# Customize the appearance of the chart
fig.update_layout(title='Comparison of Ratios between Grab Holdings and Gojek in 2021',
yaxis_title='Ratio')
fig.update_layout(title_font=dict(size=20),legend_font=dict(size=11),
yaxis_title_font=dict(size=16),)
# For a white background
fig.update_layout(paper_bgcolor='white', plot_bgcolor='white')
# Display the chart
fig.show()